home *** CD-ROM | disk | FTP | other *** search
- //**
- //** Mercury Mail Transport System - Daemon Interface Definitions
- //** Copyright (c) 1997-99, David Harris, All Rights Reserved.
- //**
- //** Note: the structures defined in this file are all BYTE-ALIGNED.
- //** This is very important - if you are using a Borland Compiler
- //** and your project uses WORD or DWORD alignment, then you will
- //** need to add "#pragma option -a1" before you include this file
- //** to ensure that the compiler aligns the structures correctly.
- //** Getting the byte alignment wrong will almost certainly result
- //** in your Daemon crashing when you load it.
- //**
-
- #ifndef _DAEMON_H
- #define _DAEMON_H
-
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- #ifndef INTS_DEFINED
- #define INTS_DEFINED
- // INT_16 and UINT_16 must be 16-bit Integer types
- typedef unsigned short UINT_16;
- typedef short INT_16;
- typedef unsigned long UINT_32;
- typedef long INT_32;
- #endif
-
-
- //**
- //** Section 1: Data type definitions and constants for lists
- //**
-
- #ifndef _LISTS_H
-
- struct _l_node
- {
- unsigned int flags, number;
- struct _l_node *next, *prev;
- void *data;
- };
-
- typedef struct _l_node LNODE;
-
- struct _lv_node
- {
- unsigned int flags, number;
- struct _lv_node *next, *prev;
- BYTE data [];
- };
-
- typedef struct _lv_node LVNODE;
-
- typedef struct
- {
- LNODE *top, *end; /* pointers to start/end of list */
- int icount; /* number of items in list */
- unsigned isize; /* size of *data in LNODE */
- int ilimit; /* maximum size of list - no limit if 0 */
- int ialloc; /* whether or not to allocate space for items */
- unsigned int last_acc; /* Last data accessed using get_list_data */
- LNODE *last_data; /* " " " " " " " " " " */
- } LIST;
-
- #endif
-
- //**
- //** Section 2: Data type definitions and constants for
- //** Job Management
- //**
-
- // Rewind flags - passed to ji_rewind_job
-
- #define JR_CONTROL 1
- #define JR_DATA 2
-
- // Diagnostic flags - passed to ji_set/get_diagnostics
-
- #define JD_ELEMENT 1
- #define JD_JOB 2
-
- typedef struct
- {
- int structlen;
- char jobstatus;
- long jobflags;
- char status;
- char *from;
- char *to;
- long dsize;
- long rsize;
- int total_rcpts;
- int total_failures;
- int total_retries;
- char ip1 [16];
- char ip2 [16];
- char ip3 [16];
- char ip4 [16];
- char jobid [20];
- } JOBINFO;
-
- enum // Job types, for ji_scan_* and ji_create_job
- {
- JT_GENERAL, // Local and newly-submitted mail
- JT_OUTGOING, // Only mail destined for the outside world
- JT_ANY // Any type of job
- };
-
- enum // "mode" values for ji_set_element_status
- {
- JS_COMPLETED, // "date" is ignored
- JS_FAILED, // "date" is ignored
- JS_RETRY, // "date" is used for requeuing if non-NULL
- JS_PENDING, // "date" is ignored
- JS_TEMP_FAIL // "date" is ignored
- };
-
- enum // "type" values for ji_get_next_element
- {
- JE_ANY, // Any type of element is OK
- JE_READY, // Only return elements ready to be sent
- JE_FAILED, // Only return elements marked as failed
- JE_COMPLETED, // Only return elements marked as completed
- JE_PENDING, // Only return elements marked as "pending"
- JE_TEMP_FAIL // Only return elements marked as temporarily failed
- };
-
-
- //**
- //** Section 3: General Mercury data type and constant definitions
- //** Many of these structures are not directly used by Daemons.
- //**
-
- #ifndef MAXFPATH
- #define MAXFPATH 128
- #endif
-
- #ifndef size
- #define size(x) (sizeof (x) / sizeof (x [0]))
- #endif
-
- #define MAXUIC 128
- #define MAXHOST 128
-
- // Statistics manager constants.
-
- #define STC_INTEGER 0
- #define STC_STRING 1
- #define STC_DATE 2
-
- #define STF_CUMULATIVE 1
- #define STF_PEAK 2
- #define STF_UNIQUE 4
-
- // Logging console manager priority constants
-
- #define LOG_DEBUG 25
- #define LOG_INFO 20
- #define LOG_NORMAL 15
- #define LOG_SIGNIFICANT 10
- #define LOG_URGENT 5
- #define LOG_NONE 0
-
- // Constants that can be passed to "create_object"
-
- #define OBJ_USER 1
- #define OBJ_ADMINISTRATOR 2
-
- typedef unsigned char UCHAR;
- typedef unsigned short USHORT;
- typedef unsigned long ULONG;
-
- // INT_16 and UINT_16 must be 16-bit Integer types
- typedef unsigned short UINT_16;
- typedef short INT_16;
-
- typedef struct
- {
- char auto_forward [60];
- char gw_auto_forward [60]; // Mercury uses this field for forwarding
- char from_alias [60]; // Alternative From: field value
- unsigned flags;
- char security;
- } PMPROP;
-
- typedef struct
- {
- char *name;
- char *domain;
- char *login_name;
- char *password;
- } SERVER_ID;
-
- typedef struct
- {
- char *name;
- char *groupname;
- char *hostname;
- } GROUP_ID;
-
- typedef struct
- {
- char *match;
- char *rewrite;
- } REWRITE;
-
- typedef struct
- {
- char lname [48];
- char fname [128]; // Name of container file for list
- char moderator [80]; // Primary list moderator (if any)
- char title [80]; // Title for list (used in "to" field
- char welcome_file [128]; // File to send to new subscribers
- char farewell_file [128]; // File to send to unsubscribers
- char ispublic; // NZ if open subscription is available
- char matched; // NZ if the address passed in is a moderator
- char moderated; // NZ if mailing to the list is restricted
- char allow_enumeration; // NZ if anyone may use ENUMERATE
- char reply_to_list; // NZ if replies should go to the list
- int limit; // Maximum allowable number of subscribers
- char errors_to [80]; // Address to which errors should be referred
- char restricted; // NZ if only list members may mail to the list
- int fanout; // Number of jobs to "fan" the delivery to
- char anonymous; // Whether this list is anonymous or not
- char title_is_address; // If NZ, the 'title' field contains an address
- char digest_name [14]; // Name of digest file
- unsigned long digest_maxsize;
- int digest_maxwait;
- char archive_file [128]; // File into which to archive messages
- char digest_default; // If NZ, new users are default to digest mode
- char list_headers; // Use IETF draft helper headers
- char list_help [80]; // Help URL
- char list_signature [128]; // List's signature file
- char concealed; // If NZ, do not publicize via the maiser LIST
- long maximum_size; // Largest message that may be submitted to list
- char password [128]; // Moderator password or password filename
- char pwd_is_filename; // NZ if "password" is a filename
- } DLIST;
-
- #define FS_BOLD 1
- #define FS_ITALIC 2
- #define FS_FIXED 4
- #define FS_OEMCHARS 8
-
- typedef struct
- {
- char fontname [LF_FACESIZE];
- INT_16 fontsize, style;
- } FONTSPEC;
-
- typedef struct
- {
- char alias [60];
- char obj_name [48];
- char server [48];
- long flags; /* Unused at present - might be handy later */
- } CHBIND;
-
- typedef struct
- {
- char alias [180], name [180];
- } ALIAS;
-
-
- // IMESSAGE structure definition:
- // The IMESSAGE structure is used internally to represent messages
- // and pseudo-messages. This structure exactly parallels a structure
- // used in Pegasus Mail v3.x and later for the same purpose, and is
- // included in this way to allow maximum code portability between
- // the two.
-
- typedef struct
- {
- INT_16 dsize; // The size of this data structure
- INT_16 mtype; // User-defined message type field
- UINT_32 flags; // First bank of message-related flags
- UINT_32 flags2; // Second bank of message-related flags
- char fname [14]; // Recommended filename for message
- char from [42]; // The sender of the message
- char subject [50]; // Can you guess what this is?
- UCHAR cdate [8]; // Timezone-corrected date from message
- UCHAR date [8]; // Raw RFC822 time and date for message
- UINT_32 fsize; // Raw size of this message
- UINT_16 colour; // Display colour for this entry
- UINT_16 charset; // Character set for message
- char unique_id [34]; // Unique ID for the message
- void *folder; // Currently unused in Mercury/32
- char filename [128]; // The file containing the message data
- } IMESSAGE;
-
- // Explanation of fields:
- // "dsize" The allocated size of this data structure
- // "mtype" The user can define message types that can be used for sorting
- // "flags" Can contain any of the flag values shown in Group 1 below
- // "flags2" Can contain any of the flag values shown in Group 2 below
- // "fname" Recommended filename for any storage to do with the message
- // "from" Display version of sender's address
- // "subject" Display version of message subject
- // "date" The date as shown in the message's RFC822 "Date:" field
- // "cdate" The date the message arrived at the local system.
- // - See below for more on the date format
- // "fsize" Raw size of the message, including headers and formatting
- // Note - no allowance is made for CR/LF conversions.
- // "colour" Index into colour table for message display colour
- // "charset" Index into character set table for message charset format
- // "unique_id" Guaranteed unique persistent global identifier for this message
- // "folder" The folder in which this message is currently stored.
- //
- // Date format: dates in IMESSAGEs use the NetWare 7-byte date format plus an
- // extra byte containing the offset in half-hour units from GMT. The date is
- // always pre-corrected to GMT by WinPMail. Note that byte 0 (the year) is
- // always the actual year - 1900, so the year 2000 is represented by 100.
- // The NetWare date format is as shown:
- //
- // Byte 0 - Year - 1900 (i.e, 2005 = 105)
- // Byte 1 - Month (ie, January == 1)
- // Byte 2 - Day (1 .. 31)
- // Byte 3 - Hour (0 - 24)
- // Byte 4 - Minute (0 - 59)
- // Byte 5 - Second (0 - 60)
- // Byte 6 - Day of week (Sunday == 0) ("255" == "not calculated")
-
- //
- // Group 1 flag values - these can be used in an IMESSAGE "flags" field.
- //
- #define FILE_MAILED 1 // The message contains a mailed file
- #define UUENCODED 2 // The message contains uuencoded data
- #define FILE_ATTACHED 0x800003L // Use this as an attachment mask.
- #define ENCRYPTED 4 // The message is encrypted
- #define EXPIRED 16 // The message is past its expiry date
- #define FILE_ASCII 32 // Flag in attachment to indicate ASCII file
- #define HAS_BEEN_READ 128 // Hey, what do you know! It's been read!
- #define ALTERNATIVE 0x100 // The message is Multipart/Alternative type
- #define IS_HTML 0x200 // The message is Text/HTML type
- #define IS_CIRCULAR 0x400 // The message is being circulated
- #define CONFIRMATION 0x2000 // Sender wants confirmation of reading
- #define FORWARD 0x8000L // The message is being forwarded
- #define IS_RTF 0x10000L // Message contains MS-RTF data
- #define COPYSELF 0x20000L // The message is a copy to self
- #define DELETED 0x40000L // The message has been deleted.
- #define MIME 0x80000L // The message is a MIME transmission
- #define REPLIED 0x100000L // The message has been replied to.
- #define FORWARDED 0x200000L // The message has been forwarded.
- #define URGENT 0x400000L // The message is urgent/high priority.
- #define BINHEX 0x800000L // The message is a BinHex file
- #define IS_MHS 0x1000000L // The message originates from MHS
- #define IS_SMTP 0x2000000L // The message originated via SMTP
- #define IS_ANNOTATED 0x4000000L // The message has an annotation
- #define ENCLOSURE 0x8000000L // The message has an enclosure
- #define HIGHLIGHTED 0x10000000L // The message has transient significance
- #define MIME_MULTI 0x20000000L // The message is in MIME Multipart format
- #define TEXT_ENRICHED 0x40000000L // The message is in "text/enriched" format
- #define READ_ONLY 0x80000000L // The message may not be deleted
-
- //
- // Group 2 flag values - these can be used in an IMESSAGE "flags2" field
- //
-
- #define IS_NEWMAIL 1 // The message is in the new mail folder
- #define IS_NOTICE 2 // The message comes from a noticeboard
- #define IS_TEMPORARY 4
-
-
- // MIME parsing definitions and structures
-
- enum // Content dispositions
- {
- MD_ATTACHMENT, MD_INLINE
- };
-
- enum // The primary types
- {
- MP_TEXT, MP_MULTIPART, MP_MESSAGE, MP_APPLICATION,
- MP_IMAGE, MP_VIDEO, MP_AUDIO, MP_UNKNOWN
- };
-
- enum // TEXT subtypes
- {
- MPT_PLAIN, MPT_RICHTEXT, MPT_HTML, MPT_RTF, MPT_UNKNOWN
- };
-
- enum // MULTIPART subtypes
- {
- MPP_MIXED, MPP_ALTERNATIVE, MPP_DIGEST,
- MPP_PARALLEL, MPP_UNKNOWN
- };
-
- enum // MESSAGE subtypes
- {
- MPM_RFC822, MPM_PARTIAL, MPM_EXTERNAL_BODY, MPM_UNKOWN
- };
-
- enum // APPLICATION subtypes
- {
- MPA_OCTET_STREAM, MPA_POSTSCRIPT, MPA_ODA, MPA_BINHEX, MPA_UNKNOWN
- };
-
- enum // IMAGE subtypes
- {
- MPI_GIF, MPI_JPEG, MPI_UNKNOWN
- };
-
- enum // VIDEO subtypes
- {
- MPV_MPEG, MPV_UNKNOWN
- };
-
- enum // AUDIO subtypes
- {
- MPU_BASIC, MPU_UNKNOWN
- };
-
- enum // MIME transfer-encodings
- {
- // Note that ME_BINHEX and ME_UUENCODE are handled as special
- // cases and as such must always appear after ME_UNKNOWN.
- ME_7BIT, ME_8BIT, ME_QUOTED_PRINTABLE, ME_BASE64, ME_UNKNOWN,
- ME_BINHEX, ME_UUENCODE
- };
-
- typedef struct
- {
- char charset [20];
- char *table;
- } MPT;
-
- typedef struct
- {
- char boundary [71];
- LIST partlist;
- } MPP;
-
- typedef struct
- {
- char fname [96];
- char type [20];
- } MPA;
-
- typedef struct
- {
- int primary, secondary, encoding, disposition;
- char p_string [20], s_string [20];
- char description [48];
- char encryptor [16]; // For encrypted attachments, the encryptor
- int encryptor_flags;
- int section;
- char fname [96];
- union
- {
- MPT mpt;
- MPP mpp;
- MPA mpa;
- IMESSAGE mpm;
- } d;
- } IMIME;
-
-
- //**
- //** Section 4: Constants for message composition functions
- //**
-
- #define OM_M_8BIT 1
-
- #define OM_MT_PLAIN 0 // A simple, single-part text/plain message
- #define OM_MT_MULTIPART 1 // A multipart/mixed message
- #define OM_MT_ALTERNATIVE 2 // A multipart/alternative message
- #define OM_MT_DIGEST 3 // A multipart/digest type
-
- #define OM_MF_TO 1 // Set the master recipient of the message
- #define OM_MF_SUBJECT 2 // Set the subject field for the message
- #define OM_MF_CC 3 // Set the secondary recipients of the message
- #define OM_MF_FROM 4 // Set the originator of the message.
- #define OM_MF_BODY 5 // Set the filename containing the message body
- #define OM_MF_RAW 6 // Add a raw header for the message.
- #define OM_MF_FLAGS 7 // Set the message's "flags" field
-
- #define OM_AE_DEFAULT 0 // Default encoding (MIME BASE64 encoding)
- #define OM_AE_TEXT 1 // Simple textual data, unencoded
- #define OM_AE_UUENCODE 2 // Uuencoding
- #define OM_AE_BINHEX 3 // Macintosh Binhex format (data fork only)
-
- #define OM_AF_INLINE 1 // Write the file as a simple textual section
- #define OM_AF_MESSAGE 2 // Write the message as a Message/RFC822 part
-
-
- //**
- //** Section 5: Protocol Module parameter block definition;
- //** Daemons are passed a Protocol Module parameter block.
- //**
-
- #define GV_QUEUENAME 1
- #define GV_SMTPQUEUENAME 2
- #define GV_MYNAME 3
- #define GV_TTYFONT 4
- #define GV_MAISERNAME 5
- #define GV_FRAMEWINDOW 6
- #define GV_SYSFONT 7
- #define GV_BASEDIR 8
- #define GV_SCRATCHDIR 9
-
- #define SYSTEM_PASSWORD 1
- #define APOP_SECRET 2
- #define PASSWD_MUST_EXIST 256
-
- // Messages that protocol modules can send using the
- // "mercury_command" function in the protocol parameter block
-
- // GET_MODULE_INTERFACE:
- // - "parm1" - char * pointer to name of module to locate
- // - Returns: the command interface function for the module, or NULL
- #define GET_MODULE_INTERFACE 1
-
- // ADD_ALIAS
- // - "parm1" - char * pointer to alias to add
- // "parm2" - char * pointer to real-world address string
- // - Returns: NZ on success, 0 on failure
- #define ADD_ALIAS 2
-
- // DELETE_ALIAS
- // - "parm1" - char * pointer to alias field of alias to delete
- // Returns: NZ on success, 0 on failure
- #define DELETE_ALIAS 3
-
- // RESOLVE_ALIAS
- // - "parm1" - char * pointer to buffer to receive address (180 char min)
- // "parm2" - char * pointer to alias to resolve
- // - Returns: NZ if a match was found, 0 if none was found.
- #define RESOLVE_ALIAS 4
-
- // RESOLVE_SYNONYM
- // - "parm1" - char * pointer to buffer to receive address (180 char min)
- // "parm2" - char * pointer to synonym to resolve
- // - Returns: NZ if a match was found, 0 if none was found
- #define RESOLVE_SYNONYM 5
-
- // QUEUE_STATE - enable or disable queue processing
- // - "parm1" - 0 to query current state, 1 to set state
- // "parm2" - 1 to pause processing, 0 to enable it
- // - Returns: The state of queue processing prior to the call
- #define QUEUE_STATE 6
-
- // DISPLAY_HELP
- // - "parm1" - section number in MERCURY.HLP
- // "parm2" - unused, must be 0
- // - Returns: Nothing.
- #define DISPLAY_HELP 512
-
- #define NOT_IMPLEMENTED 0xF0000000L
-
- #define RFC_822_TIME 0
- #define RFC_821_TIME 1
-
- typedef DWORD (*GET_VARIABLE) (int index);
- typedef int (*IS_LOCAL_ADDRESS) (char *address, char *uic, char *server);
- typedef int (*GET_DELIVERY_PATH) (char *path, char *username, char *host);
-
- typedef int (*IS_GROUP) (char *address, char *host, char *groupname);
- typedef int (*PARSE_ADDRESS) (char *target, char *source, int limit);
- typedef int (*EXTRACT_ONE_ADDRESS) (char *dest, char *source, int offset);
- typedef void (*EXTRACT_CQTEXT) (char *dest, char *source, int len);
- typedef int (*DLIST_INFO) (DLIST *dlist, char *lname, int num, char *address,
- char *errbuf, LIST *modlist);
- typedef void (*SEND_NOTIFICATION) (char *username, char *host, char *message);
- typedef int (*GET_DATE_AND_TIME) (BYTE *tm);
- typedef INT_32 (*VERIFY_PASSWORD) (char *username, char *host,
- char *password, INT_32 select);
- typedef int (*WRITE_PROFILE) (char *section, char *fname);
- typedef int (*MODULE_STATE) (char *modname, int set_value, int state);
-
- // Job control functions
-
- typedef void * (*JI_SCAN_FIRST_JOB) (int type, int mode, void **data);
- typedef void * (*JI_SCAN_NEXT_JOB) (void **data);
- typedef void (*JI_END_SCAN) (void **data);
-
- typedef int (*JI_OPEN_JOB) (void *jobhandle);
- typedef int (*JI_CLOSE_JOB) (void *jobhandle);
- typedef void (*JI_REWIND_JOB) (void *jobhandle, int flags);
- typedef int (*JI_DISPOSE_JOB) (void *jobhandle);
- typedef int (*JI_PROCESS_JOB) (void *jobhandle);
- typedef int (*JI_DELETE_JOB) (void *jobhandle);
- typedef int (*JI_ABORT_JOB) (void *jobhandle, int fatal);
- typedef int (*JI_GET_JOB_INFO) (void *jobhandle, JOBINFO *ji);
-
- typedef void * (*JI_CREATE_JOB) (int type, char *from,
- unsigned char *start_time);
- typedef int (*JI_ADD_ELEMENT) (void *jobhandle, char *address);
- typedef int (*JI_ADD_DATA) (void *jobhandle, char *data);
- typedef char * (*JI_GET_DATA) (void *jobhandle, char *buffer, int buflen);
-
- typedef char * (*JI_GET_NEXT_ELEMENT) (void *jobhandle, int type, JOBINFO *job);
- typedef int (*JI_SET_JOB_FLAGS) (void *jobhandle, long flags);
- typedef int (*JI_SET_ELEMENT_STATUS) (void *jobhandle, int mode,
- unsigned char *date);
- typedef int (*JI_SET_ELEMENT_RESOLVINFO) (void *jobhandle, char *ip1, char *ip2,
- char *ip3, char *ip4);
-
- typedef int (*JI_SET_DIAGNOSTICS) (void *jobhandle, int forwhat, char *text);
- typedef int (*JI_GET_DIAGNOSTICS) (void *jobhandle, int forwhat, char *fname);
-
- typedef void (*JI_INCREMENT_TIME) (unsigned char *tm, unsigned int secs);
-
- typedef long (*JI_TELL) (void *jobhandle, int selector);
- typedef int (*JI_SEEK) (void *jobhandle, long ofs, int selector);
-
- typedef void * (*JI_GET_JOB_BY_ID) (char *id);
- typedef int (*JI_GET_JOB_TIMES) (void *job, char *submitted, char *ready);
-
- // MNICA functions
-
- typedef int (*GET_FIRST_GROUP_MEMBER) (char *group, char *host, char *member,
- int mlen, void **data);
- typedef int (*GET_NEXT_GROUP_MEMBER) (char *member, int mlen, void **data);
- typedef int (*END_GROUP_SCAN) (void **data);
- typedef int (*IS_VALID_LOCAL_USER) (char *address, char *username, char *host);
- typedef int (*IS_GROUP_MEMBER) (char *host, char *username, char *groupname);
- typedef int (*GET_FIRST_USER_DETAILS) (char *host, char *match, char *username,
- int ulen, char *address, int alen, char *fullname, int flen, void **data);
- typedef int (*GET_NEXT_USER_DETAILS) (char *username, int ulen, char *address,
- int alen, char *fullname, int flen, void **data);
- typedef int (*GET_USER_DETAILS) (char *host, char *match, char *username, int ulen,
- char *address, int alen, char *fullname, int flen);
- typedef int (*END_USER_SCAN) (void **data);
- typedef void (*READ_PMPROP) (char *userid, char *server, PMPROP *p);
- typedef int (*CHANGE_OWNERSHIP) (char *fname, char *host, char *newowner);
- typedef int (*BEGIN_SINGLE_DELIVERY) (char *uic, char *server, void **data);
- typedef void (*END_SINGLE_DELIVERY) (void **data);
-
- // Miscellaneous functions - Mercury 2.11 and later only
-
- typedef DWORD (*MERCURY_COMMAND) (DWORD selector, DWORD parm1, DWORD parm2);
- typedef char * (*GET_DATE_STRING) (int dtype, char *buf, BYTE *date);
- typedef char * (*RFC822_TIME) (char *buffer);
- typedef char * (*RFC821_TIME) (char *buffer);
-
- // File I/O and parsing functions - Mercury 2.15 and later only
-
- typedef INT_32 (*FM_OPEN_FILE) (char *path, UINT_32 flags);
- typedef INT_32 (*FM_OPEN_MESSAGE) (IMESSAGE *im, UINT_32 flags);
- typedef int (*FM_CLOSE_MESSAGE) (INT_32 id);
- typedef char * (*FM_GETS) (char *buf, INT_32 max, INT_32 id);
- typedef INT_16 (*FM_GETC) (INT_32 id);
- typedef void (*FM_UNGETC) (INT_16 c, INT_32 id);
- typedef INT_32 (*FM_READ) (INT_32 id, char *buffer, INT_32 bufsize);
- typedef INT_32 (*FM_GETPOS) (INT_32 fil);
- typedef INT_16 (*FM_SETPOS) (INT_32 fil, INT_32 offset);
- typedef INT_32 (*FM_GET_FOLDED_LINE) (INT_32 fil, char *line, int limit);
- typedef char * (*FM_FIND_HEADER) (INT_32 fil, char *name, char *buf, int len);
- typedef int (*FM_EXTRACT_MESSAGE) (void *job, char *fname, int flags);
-
- typedef int (*PARSE_HEADER) (INT_32 fil, IMESSAGE *m);
- typedef int (*MIME_PREP_MESSAGE) (INT_32 fil, char *fname, int headers);
- typedef int (*PARSE_MIME) (INT_32 fil, IMIME *m);
- typedef void (*FREE_MIME) (IMIME *m);
- typedef int (*FAKE_IMESSAGE) (IMESSAGE *im, char *dest, char *src,
- IMIME *m, char *boundary);
- typedef int (*DECODE_MIME_HEADER) (char *dest, char *src);
- typedef int (*ENCODE_MIME_HEADER) (char *dest, char *src, int raw);
-
- typedef void * (*OM_CREATE_MESSAGE) (UINT_32 mtype, UINT_32 flags);
- typedef INT_32 (*OM_DISPOSE_MESSAGE) (void *mhandle);
- typedef INT_32 (*OM_ADD_FIELD) (void *mhandle, UINT_32 selector, char *data);
- typedef INT_32 (*OM_ADD_ATTACHMENT) (void *mhandle, char *fname, char *ftype,
- char *description, UINT_32 encoding, UINT_32 flags, void *reserved);
- typedef INT_32 (*OM_WRITE_MESSAGE) (void *mhandle, char *fname);
- typedef void * (*OM_SEND_MESSAGE) (void *mhandle, char *envelope);
-
- typedef int (*ENCODE_BASE64_STR) (char *dest, char *src, int srclen);
- typedef int (*DECODE_BASE64_STR) (char *dest, char *src, char *table);
-
- typedef INT_32 (*ST_REGISTER_MODULE) (char *module_name);
- typedef INT_32 (*ST_UNREGISTER_MODULE) (INT_32 mhandle);
- typedef INT_32 (*ST_CREATE_CATEGORY) (INT_32 mhandle, char *cname,
- INT_32 ctag, INT_32 ctype, INT_32 dlen, UINT_32 flags);
- typedef INT_32 (*ST_REMOVE_CATEGORY) (INT_32 mhandle, UINT_32 ctag);
- typedef INT_32 (*ST_SET_HCATEGORY) (INT_32 chandle, UINT_32 data);
- typedef INT_32 (*ST_SET_CATEGORY) (INT_32 mhandle, INT_32 ctag, UINT_32 data);
-
- typedef void (*LOGSTRING) (INT_16 ltype, INT_16 priority, char *str);
- typedef void (*LOGDATA) (INT_16 ltype, INT_16 priority, char *fmt, ...);
-
- typedef INT_32 (*CREATE_OBJECT) (char *objectname, INT_32 objecttype,
- char *id, INT_32 flags);
- typedef INT_32 (*SET_PASSWORD) (char *username, char *host, char *newpassword,
- char *oldpassword, INT_32 select);
-
- typedef INT_32 (*ST_GET_NEXT_MODULE) (INT_32 mhandle, char *modname);
- typedef INT_32 (*ST_GET_NEXT_CATEGORY) (INT_32 mhandle, INT_32 chandle,
- char *cname, INT_32 *ctype, INT_32 *clen, INT_32 *cflags);
- typedef INT_32 (*ST_GET_CATEGORY_DATA) (INT_32 chandle, void *data);
- typedef INT_32 (*ST_EXPORT_STATS) (INT_32 mhandle, char *fname, UINT_32 flags);
-
- typedef INT_32 (*SELECT_PRINTER) (char *devicename, int maxlen);
- typedef INT_32 (* PRINT_FILE) (char *fname, char *printername, UINT_32 flags,
- INT_32 lrmargin, INT_32 tbmargin, char *title, char *username, char *fontname,
- INT_32 fontsize);
-
- typedef struct
- {
- long dsize; // Size of this structure
- char vmajor, vminor;
- HWND hMDIParent;
- GET_VARIABLE get_variable;
- IS_LOCAL_ADDRESS is_local_address;
- IS_GROUP is_group;
- PARSE_ADDRESS parse_address;
- EXTRACT_ONE_ADDRESS extract_one_address;
- EXTRACT_CQTEXT extract_cqtext;
- DLIST_INFO dlist_info;
- SEND_NOTIFICATION send_notification;
- GET_DELIVERY_PATH get_delivery_path;
- GET_DATE_AND_TIME get_date_and_time;
- VERIFY_PASSWORD verify_password;
- WRITE_PROFILE write_profile;
- MODULE_STATE module_state;
-
- // Job control functions
-
- JI_SCAN_FIRST_JOB ji_scan_first_job;
- JI_SCAN_NEXT_JOB ji_scan_next_job;
- JI_END_SCAN ji_end_scan;
- JI_OPEN_JOB ji_open_job;
- JI_CLOSE_JOB ji_close_job;
- JI_REWIND_JOB ji_rewind_job;
- JI_DISPOSE_JOB ji_dispose_job;
- JI_PROCESS_JOB ji_process_job;
- JI_DELETE_JOB ji_delete_job;
- JI_ABORT_JOB ji_abort_job;
- JI_GET_JOB_INFO ji_get_job_info;
- JI_CREATE_JOB ji_create_job;
- JI_ADD_ELEMENT ji_add_element;
- JI_ADD_DATA ji_add_data;
- JI_GET_DATA ji_get_data;
- JI_GET_NEXT_ELEMENT ji_get_next_element;
- JI_SET_ELEMENT_STATUS ji_set_element_status;
- JI_SET_ELEMENT_RESOLVINFO ji_set_element_resolvinfo;
- JI_SET_DIAGNOSTICS ji_set_diagnostics;
- JI_GET_DIAGNOSTICS ji_get_diagnostics;
- JI_INCREMENT_TIME ji_increment_time;
-
- // MNICA (Network interface) functions
-
- GET_FIRST_GROUP_MEMBER get_first_group_member;
- GET_NEXT_GROUP_MEMBER get_next_group_member;
- END_GROUP_SCAN end_group_scan;
- IS_VALID_LOCAL_USER is_valid_local_user;
- IS_GROUP_MEMBER is_group_member;
- GET_FIRST_USER_DETAILS get_first_user_details;
- GET_NEXT_USER_DETAILS get_next_user_details;
- GET_USER_DETAILS get_user_details;
- END_USER_SCAN end_user_scan;
- READ_PMPROP read_pmprop;
- CHANGE_OWNERSHIP change_ownership;
- BEGIN_SINGLE_DELIVERY begin_single_delivery;
- END_SINGLE_DELIVERY end_single_delivery;
-
- // Miscellaneous functions
-
- MERCURY_COMMAND mercury_command;
- GET_DATE_STRING get_date_string;
- RFC822_TIME rfc822_time;
- RFC821_TIME rfc821_time;
-
- // File parsing and I/O functions
-
- FM_OPEN_FILE fm_open_file;
- FM_OPEN_MESSAGE fm_open_message;
- FM_CLOSE_MESSAGE fm_close_message;
- FM_GETS fm_gets;
- FM_GETC fm_getc;
- FM_UNGETC fm_ungetc;
- FM_READ fm_read;
- FM_GETPOS fm_getpos;
- FM_SETPOS fm_setpos;
- FM_GET_FOLDED_LINE fm_get_folded_line;
- FM_FIND_HEADER fm_find_header;
- FM_EXTRACT_MESSAGE fm_extract_message;
-
- PARSE_HEADER parse_header;
- MIME_PREP_MESSAGE mime_prep_message;
- PARSE_MIME parse_mime;
- FREE_MIME free_mime;
- FAKE_IMESSAGE fake_imessage;
- DECODE_MIME_HEADER decode_mime_header;
- ENCODE_MIME_HEADER encode_mime_header;
-
- OM_CREATE_MESSAGE om_create_message;
- OM_DISPOSE_MESSAGE om_dispose_message;
- OM_ADD_FIELD om_add_field;
- OM_ADD_ATTACHMENT om_add_attachment;
- OM_WRITE_MESSAGE om_write_message;
- OM_SEND_MESSAGE om_send_message;
-
- ENCODE_BASE64_STR encode_base64_str;
- DECODE_BASE64_STR decode_base64_str;
-
- ST_REGISTER_MODULE st_register_module;
- ST_UNREGISTER_MODULE st_unregister_module;
- ST_CREATE_CATEGORY st_create_category;
- ST_REMOVE_CATEGORY st_remove_category;
- ST_SET_HCATEGORY st_set_hcategory;
- ST_SET_CATEGORY st_set_category;
-
- JI_TELL ji_tell;
- JI_SEEK ji_seek;
- JI_SET_JOB_FLAGS ji_set_job_flags;
-
- LOGSTRING logstring;
- LOGDATA logdata;
-
- CREATE_OBJECT create_object;
- SET_PASSWORD set_password;
-
- ST_GET_NEXT_MODULE st_get_next_module;
- ST_GET_NEXT_CATEGORY st_get_next_category;
- ST_GET_CATEGORY_DATA st_get_category_data;
- ST_EXPORT_STATS st_export_stats;
-
- JI_GET_JOB_BY_ID ji_get_job_by_id;
- JI_GET_JOB_TIMES ji_get_job_times;
-
- SELECT_PRINTER select_printer;
- PRINT_FILE print_file;
- } M_INTERFACE;
-
-
- #ifdef USES_M_INTERFACE
-
- // Convenience macros: allow calls to internal Mercury functions to
- // be made in the same way as they would be in the core code (good
- // for portability).
-
- // Values for the "flags" field of print_file
-
- #define PRT_MESSAGE 1 // Print as an RFC822 message
- #define PRT_REFORMAT 2 // Reformat long lines when printing
- #define PRT_TIDY 4 // Print only "important" headers
- #define PRT_FOOTER 8 // Print a footer on each page
- #define PRT_NOHEADERS 16 // Print no message headers
- #define PRT_FIRSTONLY 32 // Print only first line of headers
- #define PRT_ITALICS 64 // Print quoted text in italics
-
- extern M_INTERFACE *mi;
-
- #define get_variable(x) (mi->get_variable (x))
- #define is_local_address(a,u,s) (mi->is_local_address (a, u, s))
- #define is_group(a,h,g) (mi->is_group (a, h, g))
- #define parse_address(t,s,l) (mi->parse_address (t, s, l))
- #define extract_one_address(d,s,o) (mi->extract_one_address (d, s, o))
- #define extract_cqtext(d,s,l) (mi->extract_cqtext (d, s, l))
- #define dlist_info(d,l,n,a,e,m) (mi->dlist_info(d, l, n, a, e, m))
- #define send_notification(u,h,m) (mi->send_notification (u, h, m))
- #define get_delivery_path(p,u,h) (mi->get_delivery_path (p, u, h))
- #define get_date_and_time(b) (mi->get_date_and_time (b))
- #define verify_password(u,s,p,e) (mi->verify_password (u, s, p, e))
- #define write_profile(s,f) (mi->write_profile (s, f))
- #define module_state(m,v,s) (mi->module_state (m, v, s))
-
- #define ji_scan_first_job(t,m,d) (mi->ji_scan_first_job (t,m,d))
- #define ji_scan_next_job(d) (mi->ji_scan_next_job (d))
- #define ji_end_scan(d) (mi->ji_end_scan (d))
- #define ji_open_job(j) (mi->ji_open_job (j))
- #define ji_close_job(j) (mi->ji_close_job (j))
- #define ji_rewind_job(j,f) (mi->ji_rewind_job (j,f))
- #define ji_dispose_job(j) (mi->ji_dispose_job (j))
- #define ji_process_job(j) (mi->ji_process_job (j))
- #define ji_delete_job(j) (mi->ji_delete_job (j))
- #define ji_abort_job(j,f) (mi->ji_abort_job (j, f))
- #define ji_get_job_info(j,i) (mi->ji_get_job_info (j, i))
- #define ji_create_job(t,f,s) (mi->ji_create_job (t,f,s))
- #define ji_add_element(j,a) (mi->ji_add_element (j,a))
- #define ji_add_data(j,d) (mi->ji_add_data (j,d))
- #define ji_get_data(j,b,l) (mi->ji_get_data (j,b,l))
- #define ji_get_next_element(j,t,i) (mi->ji_get_next_element (j,t,i))
- #define ji_set_element_status(j,m,d) (mi->ji_set_element_status (j,m,d))
- #define ji_set_element_resolvinfo(j,k,l,m,n) (mi->ji_set_element_resolvinfo (j,k,l,m,n))
- #define ji_set_diagnostics(j,w,t) (mi->ji_set_diagnostics (j,w,t))
- #define ji_get_diagnostics(j,w,f) (mi->ji_get_diagnostics (j,w,f))
- #define ji_increment_time(t,s) (mi->ji_increment_time (t,s))
- #define ji_tell(j,s) (mi->ji_tell (j,s))
- #define ji_seek(j,o,s) (mi->ji_seek(j,o,s))
- #define ji_set_job_flags(j,f) (mi->ji_set_job_flags(j,f))
- #define ji_get_job_by_id(i) (mi->ji_get_job_by_id(i))
- #define ji_get_job_times(j,s,r) (mi->ji_get_job_times(j,s,r))
-
- #define get_first_group_member(g,h,m,l,d) (mi->get_first_group_member(g,h,m,l,d))
- #define get_next_group_member(m,l,d) (mi->get_next_group_member(m,l,d))
- #define end_group_scan(d) (mi->end_group_scan(d))
- #define is_valid_local_user(a,u,h) (mi->is_valid_local_user(a,u,h))
- #define is_group_member(h,u,g) (mi->is_group_member(h,u,g))
- #define get_first_user_details(h,n,u,ul,a,al,f,fl,d) (mi->get_first_user_details(h,n,u,ul,a,al,f,fl,d))
- #define get_next_user_details(u,ul,a,al,f,fl,d) (mi->get_next_user_details(u,ul,a,al,f,fl,d))
- #define get_user_details(h,m,u,ul,a,al,f,fl) (mi->get_user_details(h,m,u,ul,a,al,f,fl))
- #define end_user_scan(d) (mi->end_user_scan(d))
- #define read_pmprop(u,s,p) (mi->read_pmprop(u,s,p))
- #define change_ownership(f,h,n) (mi->change_ownership(f,h,n))
- #define begin_single_delivery(u,s,d) (mi->begin_single_delivery(u,s,d))
- #define end_single_delivery(d) (mi->end_single_delivery(d))
-
- #define mercury_command(s,p1,p2) (mi->mercury_command(s,p1,p2))
- #define get_date_string(s,b,d) (mi->get_date_string(s,b,d))
- #define rfc822_time(s) (mi->rfc822_time(s))
- #define rfc821_time(s) (mi->rfc821_time(s))
-
- #define fm_open_file(p,f) (mi->fm_open_file(p,f))
- #define fm_open_message(i,f) (mi->fm_open_message(i,f))
- #define fm_close_message(i) (mi->fm_close_message(i))
- #define fm_gets(b,m,i) (mi->fm_gets(b,m,i))
- #define fm_getc(i) (mi->fm_getc(i))
- #define fm_ungetc(c,i) (mi->fm_ungetc(c,i))
- #define fm_read(i,b,s) (mi->fm_read(i,b,s))
- #define fm_getpos(f) (mi->fm_getpos(f))
- #define fm_setpos(f,o) (mi->fm_setpos(f,o))
- #define fm_get_folded_line(f,l,x) (mi->fm_get_folded_line(f,l,x))
- #define fm_find_header(i,n,b,l) (mi->fm_find_header(i,n,b,l))
- #define fm_extract_message(j,n,f) (mi->fm_extract_message(j,n,f))
-
- #define parse_header(f,m) (mi->parse_header(f,m))
- #define mime_prep_message(i,f,h) (mi->mime_prep_message(i,f,h))
- #define parse_mime(i,m) (mi->parse_mime(i,m))
- #define free_mime(m) (mi->free_mime(m))
- #define fake_imessage(i,s,m,e,b) (mi->fake_imessage(i,s,m,e,b))
- #define decode_mime_header(d,s) (mi->decode_mime_header(d,s))
- #define encode_mime_header(d,s,r) (mi->encode_mime_header(d,s,r))
-
- #define om_create_message(m,f) (mi->om_create_message(m,f))
- #define om_dispose_message(m) (mi->om_dispose_message(m))
- #define om_add_field(m,s,d) (mi->om_add_field(m,s,d))
- #define om_add_attachment(m,f,t,d,e,g,r) (mi->om_add_attachment(m,f,t,d,e,g,r))
- #define om_write_message(m,f) (mi->om_write_message(m,f))
- #define om_send_message(m,e) (mi->om_send_message(m,e))
-
- #define encode_base64_str(d,s,l) (mi->encode_base64_str(d,s,l))
- #define decode_base64_str(d,s,t) (mi->decode_base64_str(d,s,t))
-
- #define st_register_module(m) (mi->st_register_module(m))
- #define st_unregister_module(h) (mi->st_unregister_module(h))
- #define st_create_category(m,c,t,y,l,f) (mi->st_create_category(m,c,t,y,l,f))
- #define st_remove_category(m,c) (mi->st_remove_category(m,c))
- #define st_set_hcategory(c,d) (mi->st_set_hcategory(c,d))
- #define st_set_category(m,c,d) (mi->st_set_category(m,c,d))
-
- #define logstring(l,p,s) (mi->logstring(l,p,s))
- // "logdata" has variable parameters and cannot be accessed via a macro
-
- #define create_object(n,t,i,f) (mi->create_object(n,t,i,f))
- #define set_password(u,h,n,o,s) (mi->set_password(u,h,n,o,s))
-
- #define st_get_next_module(m,n) (mi->st_get_next_module(m,n))
- #define st_get_next_category(m,h,c,t,l,f) (mi->st_get_next_category(m,h,c,t,l,f))
- #define st_get_category_data(c,d) (mi->st_get_category_data(c,d))
- #define st_export_stats(m,f,l) (mi->st_export_stats(m,f,l))
-
- #define select_printer(d,m) (mi->select_printer(d,m))
- #define print_file(f,p,l,m,b,t,u,n,z) (mi->print_file(f,p,l,m,b,t,u,n,z))
-
- #endif // USES_M_INTERFACE
-
- #ifdef __cplusplus
- };
- #endif
-
- #endif // _DAEMON_H
-
-